import Vue from "vue";
import Vuex from "vuex";
import {
    isEmpty,
    Token,
    User,
    Session
} from "../utils";
import {
    userApi,
    authApi
} from "../api";

Vue.use(Vuex);

export default new Vuex.Store({
    state: {
        //公共的变量，这里的变量不能随便修改，只能通过触发mutations的方法才能改变
        userInfo: {},
        correctInfo: {},
    },
    getters: {
        isLogin(state) {
            return !!state.userInfo.id;
        },
        userType(state) {
            return state.userInfo.userType;
        },
        getNumber(state) {
            return state.number;
        }
    },
    mutations: {
        //相当于同步的操作
        setUserInfo(state, data) {
            console.log("设置userInfo", data);
            state.userInfo = data;
        },
        setCorrectInfo(state, data) {
            console.log("设置correctInfo", data);
            state.correctInfo = data;
        },
    },
    actions: {
        //相当于异步的操作,不能直接改变state的值，只能通过触发mutations的方法才能改变
        async getUserInfo({
            commit
        }) {
            if (!isEmpty(this.state.userInfo)) return this.state.userInfo;
            const {
                code,
                data
            } = await userApi.getUser();
            if (code !== 1) return null;
            commit("setUserInfo", data);
            return data;
        },
        async login({
            dispatch
        }) {
            await dispatch("getUserInfo");
        },
        // 自动登出，token过期等原因
        logout({
            dispatch
        }) {
            // 删除token
            User.remove();
            Token.remove();
            Session.remove();
            // 重置state
            dispatch("reset");
            // 跳转至登录页
            uni.reLaunch({
                url: "/pages/public/login",
            });
        },
        // 用户手动登出
        async logoutByUser({
            dispatch
        }) {
            // 请求后端删除token
            // authApi.logout();
            dispatch("logout");
        },
        reset({
            commit
        }) {
            commit("setUserInfo", {});
        },
    },
});
// 内部使用state变量
// this.state.变量名

// 外部使用state变量
// this.$store.state.变量名

// 外部调用mutations
// this.$store.commit("方法名", 参数);

// 外部调用actions
// this.$store.dispatch("方法名", 参数);

// actions调用mutations
// actionsMethod({ commit }) {
//   commit("mutationsMethod", params);
// },